package chapter01

/*
* @ author:  frank
* @ date: 2020/7/19 0019
* @ description:
* Groovy 方法
* https://www.w3cschool.cn/groovy/groovy_methods.html
*
*
*/


class MyMethods {

    static def DisplayMessage() {
        println("Hello World, Groovy,Frank");
    }

    static void sum(int a, int b=10) {
        int res = a + b;
        println(res);
    }


    static void main(String[] args) {
//        DisplayMessage();
        sum(10, 20);
        sum(1,3);

        DisplayMessage();
    }
}



class MyMethods2 {


    //    默认参数
    static int  sum(int a, int b=10) {
        int res = a + b;
        //  函数返回值
        return res
    }


    static void main(String[] args) {
//        DisplayMessage();
//        sum(10, 20);
        int res = sum(5,40);
        println("res = ${res}");
    }
}



class MyMethods3 {
    // 定义一个整型变量 x
    int x;

    // 获取 x 的值
    public int getX() {
        return x;
    }

    // 设置 x 的值
    public void setX(int pX) {
        x = pX;
    }

    // 主方法，程序入口
    static void main(String[] args) {
        // 创建 MyMethods3 类的一个实例
        MyMethods3 ex = new MyMethods3();

        // 调用 setX 方法设置 x 的值为 100
        ex.setX(10000);

        // 调用 getX 方法获取 x 的值并打印
        println(ex.getX());
    }
}



class MyMethods4 {
    // 定义一个静态整型变量 x，并初始化为 100
    static int x = 100;

    // 获取静态变量 x 的值
    public static int getX() {
        // 定义一个局部变量 lx，并初始化为 200
        int lx = 200;

        // 打印局部变量 lx 的值
        println("lx:${lx}");

        // 返回静态变量 x 的值
        return x;
    }

    // 主方法，程序入口
    static void main(String[] args) {
        // 调用 getX 方法并打印其返回值
        println(getX());
    }
}



/**
 * MyMethods5 类示例，包含一个整数属性和一个获取该属性的方法。
 */
class MyMethods5 {
    int x = 100;

    /**
     * 获取属性 x 的值，并在获取前将 x 的值修改为 200。
     *
     * @return 修改后的 x 的值
     * 在 Groovy 中，`return x;` 和 `return this.x;` 在大多数情况下是等价的，
     * 因为 `x` 是 `MyMethods5` 类的一个实例变量。以下是它们的区别和解释：

     1. **直接访问变量 (`return x;`)**:
     - 当你在方法内部直接使用变量名 `x` 时，Groovy 会自动将其解析为当前实例的 `x` 属性。
     - 这种方式更加简洁，通常用于代码中。

     2. **使用 `this` 关键字 (`return this.x;`)**:
     - 使用 `this.x` 明确指出了你正在访问的是当前实例的 `x` 属性。
     - 这种方式在某些情况下可以提高代码的可读性，特别是在变量名和实例变量名相同的情况下，可以避免混淆。
     - 例如，如果你有一个方法参数也叫 `x`，那么 `this.x` 可以明确区分实例变量和方法参数。

     在你的代码中，`return x;` 和 `return this.x;` 是等价的，因为 `x` 是一个实例变量。以下是两种方式的示例：

     ```groovy
     public int getX() {
     // 直接访问实例变量
     return x;
     }

     public int getX() {
     // 使用 this 关键字访问实例变量
     return this.x;
     }
     ```

     总结来说，选择哪种方式主要取决于个人或团队的编码风格偏好。
     如果代码清晰且没有命名冲突，直接使用 `return x;` 是更简洁的方式。
     如果有潜在的命名冲突，使用 `this.x` 可以提高代码的可读性和可维护性。
     */
    public int getX() {
//        return x;
        return this.x;
    }

    public  int setX(int value){
        this.x = value;
    }

    /**
     * 主方法，用于创建 MyMethods5 类的实例并调用 getX 方法。
     *
     * @param args 命令行参数（未使用）
     */
    static void main(String[] args) {
        MyMethods5 ex = new MyMethods5();
        println(ex.getX());

        println("setX = 200 begin ...");
        ex.setX(200);
        println(ex.getX());
    }

}

